package com.baor.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baor.dao.GoodsDao;
import com.baor.dao.SeparateDao;
import com.baor.domain.GoodsVo;
import com.baor.domain.SeparateVo;
import com.baor.service.SeparateService;
import com.baor.utils.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class SeparateServiceImpl implements SeparateService {

    @Autowired
    private SeparateDao separateDao;

    @Autowired
    private GoodsDao goodsDao;


    @Override
    public AjaxResult<?> separateList(Map<String, Object> params) {

        Map<String, Object> res = new HashMap<>();

        //商品分类
        //所有分类
        LambdaQueryWrapper<SeparateVo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SeparateVo::getDelflag, 0).eq(SeparateVo::getSiteId, params.get("siteId"));
        List<SeparateVo> all = separateDao.selectList(queryWrapper);
        //父级分类
        List<SeparateVo> parent = separateDao.selectList(new LambdaQueryWrapper<SeparateVo>().eq(SeparateVo::getSeparateSuperior, 0).eq(SeparateVo::getDelflag, 0).eq(SeparateVo::getSiteId, params.get("siteId")));
        for(SeparateVo p : parent){
            List<SeparateVo> child = getChild(all, p.getSeparateId());
            p.setChildren(child);
        }
        int currentPage = (int) params.get("pageIndex"); // 当前页数 int pageSize = 10; // 每页显示的条数
        int pageSize = (int) params.get("pageSize"); // 每页显示的条数
        int start = (currentPage - 1) * pageSize; // 分页起始位置
        int end = Math.min(start + pageSize, parent.size()); // 分页结束位置
        List<SeparateVo> pageParentList = parent.subList(start, end); // 获取分页后的商品列表
        int total = parent.size();
        System.out.println(total+"-------");
        res.put("separate",pageParentList);
        float pageCount = (float)total/pageSize;
        res.put("pageCount",Math.ceil(pageCount));
        return AjaxResult.success(res);
    }

    @Override
    public AjaxResult<?> separateInfo(SeparateVo separateVo) {
        SeparateVo separateInfo = separateDao.selectById(separateVo.getSeparateId());
        if(!separateInfo.getSeparateSuperior().equals("0")){
            separateInfo.setSeparateSuperior(separateDao.selectById(separateInfo.getSeparateSuperior()).getSeparateName());
        }
        if(separateInfo.getSeparateSuperior().equals("0")){
            separateInfo.setSeparateSuperior("顶级分类");
        }
        return AjaxResult.success(separateInfo);
    }

    @Override
    public AjaxResult<?> insertSeparate(SeparateVo separateVo) {
        List<SeparateVo> separateVos = separateDao.selectList(new LambdaQueryWrapper<SeparateVo>()
                .eq(SeparateVo::getDelflag, 0));
        int size = separateVos.stream().filter(x -> x.getSeparateName().equals(separateVo.getSeparateName())).collect(Collectors.toList()).size();
        if ( size > 0 )
            return AjaxResult.error("separateName is repeat");
        int size1 = separateVos.size();
        int row = separateDao.insert(separateVo);
        try {
            if ( size1 == 0 )
                goodsDao.updateSeparate(separateVo.getSeparateId());
        } catch ( Exception ex ) {
            ex.printStackTrace();
            return AjaxResult.error("(goodsDao.updateSeparate is error) and call hls");
        }
        if (row > 0) {
            return AjaxResult.success("新增成功");
        } else {
            return AjaxResult.error("新增失败");
        }
    }

    @Override
    public AjaxResult<?> updateSeparate(SeparateVo separateVo) {
        int size = separateDao.selectList(new LambdaQueryWrapper<SeparateVo>()
                .eq(SeparateVo::getDelflag, 0)
                .eq(SeparateVo::getSeparateName, separateVo.getSeparateName())).size();
        if ( size > 0 )
            return AjaxResult.error("separateName is repeat");
        int row = separateDao.updateById(separateVo);
        if (row > 0){
            return AjaxResult.success("更新成功");
        }else{
            return AjaxResult.error("更新失败");
        }
    }

    @Override
    public AjaxResult<?> deleteSeparate(SeparateVo separateVo) {
        Map<String,Object> params = new HashMap<>();
        params.put("original",separateVo.getSeparateId());
        separateVo.setDelflag(1);
        int row = separateDao.updateById(separateVo);
        List<SeparateVo> separateVos = separateDao.selectList(new LambdaQueryWrapper<SeparateVo>()
                .eq(SeparateVo::getSiteId, separateVo.getSiteId())
                .eq(SeparateVo::getDelflag, 0)
                .orderByAsc(SeparateVo::getSeparateId));
        if ( separateVos.size() != 0 ){
            Integer separateId = separateVos.get(0).getSeparateId();
            params.put("present",separateId);
            goodsDao.updateGoodsSeparate(params);
        }
        if (row > 0) {
            return AjaxResult.success("删除成功");
        } else {
            return AjaxResult.error("删除失败");
        }
    }

    @Override
    public AjaxResult<?> separateSuperior() {
        QueryWrapper<SeparateVo> wrapper = new QueryWrapper<>();
        wrapper.eq("separate_superior", 0);
        wrapper.eq("delflag", 0);
        return AjaxResult.success(separateDao.selectList(wrapper));
    }

    @Override
    public AjaxResult<?> separateSelect(Integer siteId) {
        QueryWrapper<SeparateVo> wrapper = new QueryWrapper<>();
        wrapper.eq("delflag", 0).eq("site_id", siteId);
        return AjaxResult.success(separateDao.selectList(wrapper));
    }

    public List<SeparateVo> getChild(List<SeparateVo> all,int id){
        List<SeparateVo> child = new ArrayList<>();
        for(SeparateVo s : all){
            if(Integer.parseInt(s.getSeparateSuperior()) == id && s.getDelflag() == 0){
                List<SeparateVo> c = getChild(all, s.getSeparateId());

                child.add(s);
            }
        }
        return child;
    }
}
